package com.sanalkitaplik.security;

import java.security.SignatureException;

import javax.crypto.Mac;

import javax.crypto.spec.SecretKeySpec;

/**
 * This class defines common routines for generating 
 * authentication signatures for AWS Platform requests.
 */

public class AmazonService {

    private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
    
    /**
     * Computes RFC 2104-compliant HMAC signature.
     * 
     * @param data
     *     The data to be signed.
     * @param key
     *     The signing key.
     * @return
     *     The Base64-encoded RFC 2104-compliant HMAC signature.
     * @throws
     *     java.security.SignatureException when signature generation fails
     */
    public static String calculateRFC2104HMAC(String data, String key)
        throws java.security.SignatureException
    {
        String result;
        try {
            // get an hmac_sha1 key from the raw key bytes
            SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), 
                                                         HMAC_SHA1_ALGORITHM);
            
            // get an hmac_sha1 Mac instance and initialize with the signing key
            Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
            mac.init(signingKey);
            
            // compute the hmac on input data bytes
            byte[] rawHmac = mac.doFinal(data.getBytes());
            
            // base64-encode the hmac
            result = encodeBase64(rawHmac);
        } 
        catch (Exception e) {
            throw new SignatureException("Failed to generate HMAC : " + e.getMessage());
        }
        return result;
    }
    
    /**
     * Performs base64-encoding of input bytes.
     *
     * @param rawData 
     *      Array of bytes to be encoded.
     * @return 
     *      The base64-encoded string representation of rawData.
     */
    public static String encodeBase64(byte[] rawData) {
        return Base64.encodeBytes(rawData);
    }
    
    public static void main(String[] args) {
    	try {
			System.out.println(calculateRFC2104HMAC("AWSECommerceServiceItemSearch2011-04-18T23:20:00Z", "nvhwBpbdmHq5a643r+XikK0yUqyAHeqE6+cHQd/2"));
		} catch (SignatureException e) {
			e.printStackTrace();
		}
    }
}
